package com.t2tierp.pafecf.controller;

import br.com.modelo.*;
import br.com.util.JPAUtil;
import com.t2tierp.pafecf.infra.Biblioteca;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;

public class RegistroRController {
    public R02 gravaR02(R02 pR02) {
        try {
            JPAUtil.mergeObjeto(pR02);

            SimpleDateFormat formatoData = new SimpleDateFormat("dd/MM/yyyy");
            String tripa = ""
                    + pR02.getId()
                    + pR02.getCrz()
                    + pR02.getCoo()
                    + pR02.getCro()
                    + pR02.getDataMovimento()
                    + formatoData.format(pR02.getDataEmissao())
                    + pR02.getHoraEmissao()
                    + Biblioteca.formatoDecimal("V", Double.parseDouble(pR02.getVendaBruta().toString()));
            pR02.setHashTripa(Biblioteca.MD5String(tripa));

            JPAUtil.mergeObjeto(pR02);
            return pR02;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    public void gravaR03(List<R03> pListaR03) {
        String tripa;
        for (R03 r : pListaR03) {
            try {
                tripa = r.getTotalizadorParcial()
                        + Biblioteca.formatoDecimal("V", Double.parseDouble(r.getValorAcumulado().toString()));
                r.setHashTripa(Biblioteca.MD5String(tripa));
                JPAUtil.mergeObjeto(r);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public void gravaR06(R06 pR06) {
        try {
            if (pR06.getGrg() == null) {
                pR06.setGrg(java.sql.Types.INTEGER);
            } 
            if (pR06.getCdc() == null) {
                pR06.setCdc(java.sql.Types.INTEGER);
            } else {
                pR06.setCdc(pR06.getCdc());
            }
            SimpleDateFormat formatoData = new SimpleDateFormat("yyyy-MM-dd");
            String tripa = ""
                    + pR06.getCoo()
                    + pR06.getGnf()
                    + pR06.getDenominacao()
                    + formatoData.format(pR06.getDataEmissao())
                    + pR06.getHoraEmissao()
                    + pR06.getSerieEcf()
                    + "0";
            pR06.setHashTripa(Biblioteca.MD5String(tripa));
            JPAUtil.mergeObjeto(pR06);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /*
     * TODO : R07 tem vinculo com R04 e R06. R04 são os cupons fiscais. Seria
     * interessante criar a tabela R04 e armazenar os dados dos cupons? Ou é
     * melhor pegar esses dados da tabela VendaCabecalho mesmo?
     */
    public void gravaR07(R07 pR07) {
        try {
            JPAUtil.mergeObjeto(pR07);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public List<R02> tabelaR02() {
        try {
            return JPAUtil.buscarTodos(R02.class);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    public List<R02> tabelaR02Id(Integer pId) {
        return JPAUtil.buscarPorId(R02.class, pId);
    }

    public List<R03> tabelaR03(Integer pId) {
        return JPAUtil.buscarPorId(R03.class, pId);
    }

    public List<R04> tabelaR04() {
        return JPAUtil.buscarTodos(R04.class);
    }

//    public List<R05> tabelaR05(Integer pId) {
//        consultaSQL =
//                "select count(*) as TOTAL "
//                + "from ECF_VENDA_DETALHE V, PRODUTO P, UNIDADE_PRODUTO U "
//                + "where V.ID_ECF_PRODUTO=P.ID and P.ID_UNIDADE_PRODUTO=U.ID "
//                + "and V.ID_ECF_VENDA_CABECALHO=" + pId;
//
//        try {
//            stm = bd.conectar().createStatement();
//            rs = stm.executeQuery(consultaSQL);
//            rs.first();
//            Integer totalRegistros = rs.getInt("TOTAL");
//
//            if (totalRegistros > 0) {
//                List<R05VO> listaR05 = new ArrayList<R05VO>();
//                consultaSQL =
//                        "select V.ID AS VID, V.ITEM, P.GTIN, P.DESCRICAO_PDV, V.QUANTIDADE, "
//                        + "U.NOME AS SIGLA_UNIDADE, V.VALOR_UNITARIO, V.DESCONTO, V.ACRESCIMO, "
//                        + "V.TOTAL_ITEM, V.TOTALIZADOR_PARCIAL, V.CANCELADO, P.IAT, P.IPPT "
//                        + "from ECF_VENDA_DETALHE V, PRODUTO P, UNIDADE_PRODUTO U "
//                        + "where V.ID_ECF_PRODUTO=P.ID and P.ID_UNIDADE_PRODUTO=U.ID "
//                        + "and V.ID_ECF_VENDA_CABECALHO=" + pId;
//
//                stm = bd.conectar().createStatement();
//                rs = stm.executeQuery(consultaSQL);
//                rs.beforeFirst();
//                while (rs.next()) {
//                    R05VO R05 = new R05VO();
//                    R05.setId(rs.getInt("VID"));
//                    R05.setItem(rs.getInt("ITEM"));
//                    R05.setGTIN(rs.getString("GTIN"));
//                    //TODO : Usar mesmo a descricaoPDV para esses registros R?
//                    R05.setDescricaoPDV(rs.getString("DESCRICAO_PDV"));
//                    R05.setQuantidade(rs.getDouble("QUANTIDADE"));
//                    R05.setSiglaUnidade(rs.getString("SIGLA_UNIDADE"));
//                    R05.setValorUnitario(rs.getDouble("VALOR_UNITARIO"));
//                    //TODO : Desconto e acrescimo no item? Como controlar isso?
//                    R05.setDesconto(rs.getDouble("DESCONTO"));
//                    R05.setAcrescimo(rs.getDouble("ACRESCIMO"));
//                    R05.setTotalItem(rs.getDouble("TOTAL_ITEM"));
//                    R05.setTotalizadorParcial(rs.getString("TOTALIZADOR_PARCIAL"));
//                    R05.setIndicadorCancelamento(rs.getString("CANCELADO"));
//                    /*
//                     * TODO : Quantidade cancelada, no caso de cancelamento
//                     * parcial de item. Vamos implementar isso?
//                     */
//                    if (R05.getIndicadorCancelamento().equals("S")) {
//                        R05.setQuantidadeCancelada(1.0);
//                    } else {
//                        R05.setQuantidadeCancelada(0.0);
//                    }
//                    /*
//                     * TODO : Valor cancelado, no caso de cancelamento parcial
//                     * de item. Vamos implementar isso?
//                     */
//                    if (R05.getIndicadorCancelamento().equals("S")) {
//                        R05.setValorCancelado(rs.getDouble("TOTAL_ITEM"));
//                    } else {
//                        R05.setValorCancelado(0.0);
//                    }
//                    //TODO : Cancelamento do acrescimo do item? Vamos implementar isso?
//                    R05.setCancelamentoAcrescimo(0.0);
//                    R05.setIAT(rs.getString("IAT"));
//                    R05.setIPPT(rs.getString("IPPT"));
//                    //TODO : Deixar a opção de configurar essas casas decimais?
//                    R05.setCasasDecimaisQuantidade(3);
//                    R05.setCasasDecimaisValor(2);
//
//                    listaR05.add(R05);
//                }
//                return listaR05;
//            } else {
//                //caso nao existam registros retorna nulo
//                return null;
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//            return null;
//        } finally {
//            bd.desconectar();
//        }
//    }
    public List<R06> tabelaR06() {
        try {
            return JPAUtil.buscarTodos(R06.class);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    public List<R07> tabelaR07(Integer pId) {
        try {
            EntityManager em = JPAUtil.retornarFabrica().createEntityManager();
            Query q = em.createNamedQuery("FROM R07 c WHERE c.idR06.id = ?");
            q.setParameter(1, pId);
            List<R07> retorno = q.getResultList();
            em.close();
            return retorno;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    public R01 tabelaR01() {
        try {
            EntityManager em = JPAUtil.retornarFabrica().createEntityManager();
            Query q = em.createNamedQuery("FROM R01 c");
            R01 retorno;
            try {
                retorno = (R01) q.getSingleResult();
                em.close();
                return retorno;
            } catch (javax.persistence.NoResultException e) {
                em.close();
                return null;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    public R06 ultimoRegistroR06() {
        try {
            try {
                EntityManager em = JPAUtil.retornarFabrica().createEntityManager();
                Query q = em.createNamedQuery("FROM R06 c WHERE c.id = (SELECT MAX(c1.id) FROM R06 c1)");
                R06 retorno;
                try {
                    retorno = (R06) q.getSingleResult();
                    em.close();
                    return retorno;
                } catch (javax.persistence.NoResultException e) {
                    em.close();
                    return null;
                }
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    public boolean verificaMovimentoPeriodo(Date dataInicio, Date dataFim) {
        try {
            EntityManager em = JPAUtil.retornarFabrica().createEntityManager();
            Query q = em.createNamedQuery("FROM R02 c WHERE c.dataMovimento BETWEEN ? AND ?");
            q.setParameter(1, dataInicio);
            q.setParameter(2, dataFim);
            List<R02> retorno = q.getResultList();
            em.close();
            if (retorno.size() > 0) {
                return true;
            }
            return false;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
}
